package dao;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import bean.Deposito;
import bean.ListadoMovimientos;
import bean.Movimiento;
import bean.RenglonMovimiento;

public class MovimientosStockDAO {
	
	private static MovimientosStockDAO iMovStockDAO;
	private static SessionFactory sf = null;
	
	public static MovimientosStockDAO getInstance(){
		if(iMovStockDAO == null){
			iMovStockDAO = new MovimientosStockDAO();
			sf = HibernateUtil.getSessionFactory();
		}
		return iMovStockDAO;
		
	}
	
	private MovimientosStockDAO(){	}

	public void grabarMovStock(Movimiento m) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(m);
		session.getTransaction().commit();
		session.close();
	}

	public List<RenglonMovimiento> getMovimientos() {
		Session session = sf.openSession();
		
		return session.createQuery("from Movimiento").list();
	}

	public Movimiento buscarMovimiento(int i) {
		Session session = sf.openSession();
		return (Movimiento) session.createQuery("from Movimiento m where m.id_movimiento_stock = ?").setInteger(0, i).list().get(0);
	}

	public List<ListadoMovimientos> getListadoMovimientos() {
		Session session = sf.openSession();
		Iterator it = session.createQuery("select m.id_movimiento_stock, sum(r.cantidad) from Movimiento m join m.renglones r group by m.id_movimiento_stock" ).iterate();
		
		
		List<ListadoMovimientos> listadoRetorno = new LinkedList<ListadoMovimientos>();
		while(it.hasNext()) {
			Object[] tupla = (Object[]) it.next();
			ListadoMovimientos u =  new ListadoMovimientos((Integer)tupla[0], Double.valueOf((Double)tupla[1]).floatValue ());
			listadoRetorno.add(u);
		}
		return listadoRetorno;
	}

	public Deposito buscarDeposito(int numero) {
		Session s = sf.openSession();
		return (Deposito) s.createQuery("from Deposito d where d.numero_deposito = ?").setInteger(0, numero).list().get(0);
	}

	public void grabarDeposito(Deposito depo) {
		Session s = sf.openSession();
		s.beginTransaction();
		s.persist(depo);
		s.saveOrUpdate(depo);
		s.getTransaction().commit();
		s.close();
	}
}
